package com.example;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @Author loubobooo
 * @Description # 12. 整数转罗马数字
 * @Date 2022/3/27
 */
public class IntegerToRoman {

    /**
     * @return
     * @Author loubobooo
     * @Description 罗马数字包含以下七种字符：I，V，X，L，C，D和M。
     * <p>
     * 字符          数值
     * I             1
     * V             5
     * X             10
     * L             50
     * C             100
     * D             500
     * M             1000
     * 例如， 罗马数字 2 写做II，即为两个并列的 1。12 写做XII，即为X+II。 27 写做XXVII, 即为XX+V+II。
     * <p>
     * 通常情况下，罗马数字中小的数字在大的数字的右边。但也存在特例，例如 4 不写做IIII，而是IV。数字 1 在数字 5 的左边，所表示的数等于大数
     * 5 减小数 1 得到的数值 4 。同样地，数字 9 表示为IX。这个特殊的规则只适用于以下六种情况：
     * <p>
     * I可以放在V(5) 和X(10) 的左边，来表示 4 和 9。
     * X可以放在L(50) 和C(100) 的左边，来表示 40 和90。
     * C可以放在D(500) 和M(1000) 的左边，来表示400 和900。
     * 给定一个整数，将其转为罗马数字。输入确保在 1到 3999 的范围内。
     * @Date 2022/3/27
     * @Param
     **/
    public String intToRoman(int num) {
/*        int[] nums = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        String[] romans = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
        String str = "";
        for (int i = 0, length = nums.length; i < length; i++) {
            while(num > 0 && num >= nums[i]){
                str += romans[i];
                num -= nums[i];
            }
        }
        return str;*/
        Map<Integer, String> map = new LinkedHashMap(1<<5){{
            put(1000, "M");
            put(900, "CM");
            put(500, "D");
            put(400, "CD");
            put(100, "C");
            put(90, "XC");
            put(50, "L");
            put(40, "XL");
            put(10, "X");
            put(9, "IX");
            put(5, "V");
            put(4, "IV");
            put(1, "I");
        }};

        StringBuilder stringBuilder = new StringBuilder();
        while(num > 0){
            for (Map.Entry<Integer, String> entry:map.entrySet()) {
                if(entry.getKey() <= num){
                    num -= entry.getKey();
                    stringBuilder.append(entry.getValue());
                    break;
                }
            }
        }
        return stringBuilder.toString();
    }

    public static void main(String[] args) {
        IntegerToRoman integerToRoman = new IntegerToRoman();
        String s = integerToRoman.intToRoman(1000);
        System.out.println(s);
    }

}
